home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagn_r.zip / RECORDS.SWG / 0006_RECSRCH.PAS.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-28  |  3KB  |  86 lines

  1. {
  2. HAGEN LEHMANN
  3. > Can someone help me make a search Procedure that will read
  4. > from a Record format, from the disk!!!
  5.  
  6. The easiest way to search a Record in a File is to read the Records from File
  7. and compare them With the Record that is to be searched.
  8.  
  9. if you simply want to search For a String then I've got something For you. ;-)
  10. Look at this Function:
  11. }
  12. Function Search(SearchFor : String; FileName  : String) : LongInt;
  13. Var
  14.   F               : File;
  15.   Pos,Dummy       : LongInt;
  16.   BufSize,ReadNum : Word;
  17.   Buffer          : ^Byte;
  18.   Found           : Boolean;
  19.  
  20.   Function SearchString(Var Data; Size : Word; Str  : String) : LongInt;
  21.   Var
  22.     S     : String;
  23.     Loop  : LongInt;
  24.     Found : Boolean;
  25.     L     : Byte Absolute Str;
  26.   begin
  27.     Loop  := -1;
  28.     Found := False;
  29.     if L > 0 Then   { I don't search For empty Strings, I'm not crazy }
  30.     Repeat
  31.       Inc(Loop);
  32.       { convert buffer into String }
  33.       Move(Mem[Seg(Data) : Loop], Mem[Seg(S) : Ofs(S) + 1], L + 1);
  34.       S[0] := Char(L);
  35.       if S = Str Then
  36.         Found := True;             { search For String }
  37.     Until Found Or (Loop = Size - L);
  38.     if Found Then
  39.       SearchString := Loop   { that's the File position }
  40.     else
  41.       SearchString := -1;    { I couldn't find anything }
  42.   end;
  43.  
  44. begin
  45.   Search := -1;
  46.   if MaxAvail > 65535 Then
  47.     BufSize := 65535   { check available heap }
  48.   else
  49.     BufSize := MaxAvail;
  50.   if (BufSize > 0) And (BufSize > Length(SearchFor)) Then
  51.   begin
  52.     GetMem(Buffer, BufSize);               { reserve heap For buffer }
  53.     Assign(F, FileName);
  54.     Reset(F, 1);                                         { open File }
  55.     if IOResult = 0 Then
  56.     begin
  57.       Pos   := 0;
  58.       Found := False;
  59.       Repeat
  60.         BlockRead(F, Buffer^, BufSize, ReadNum);          { read buffer }
  61.         if ReadNum > 0 Then                             { anything ok? }
  62.         begin
  63.           Dummy := SearchString(Buffer^, ReadNum, SearchFor);
  64.           if Dummy <> -1 Then                   { String has been found }
  65.           begin
  66.             Found := True;                            { set found flag }
  67.             Inc(Pos, Dummy);
  68.           end
  69.           else
  70.           begin
  71.             Inc(Pos, ReadNum - Length(SearchFor));
  72.             Seek(F, Pos);                       { set new File position }
  73.           end;
  74.         end;
  75.       Until Found Or (ReadNum <> BufSize);
  76.       if Found Then
  77.         Search := Pos            { String has been found }
  78.       else
  79.         Search := -1;         { String hasn't been found }
  80.       Close(F);
  81.     end;
  82.     Release(Buffer);                        { release reserved heap }
  83.   end;
  84. end;
  85.  
  86.